package com.aaa.common.util;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.Random;

/**
 * @ FileName: RedisUtil
 * @ Description:
 * @ Author:  STB
 * @ CreateTime: 2025/10/16 0016 9:34
 * @ Version: 1.0.0
 */
public class RedisUtil {
    // 过期时间：5分钟（300秒）
    private static final int EXPIRATION_SECONDS = 5 * 60;

    // Redis连接池
    private static JedisPool jedisPool;

    // 私有化构造方法，防止实例化
    private RedisUtil() {
    }

    /**
     * 初始化Redis连接池
     *
     * @param host     Redis服务器地址
     * @param port     Redis端口号
     * @param password Redis密码（可为null）
     */
    public static void init(String host, int port, String password) {
        if (jedisPool != null) {
            close(); // 如果已有连接池，先关闭
        }

        // 配置连接池
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(10); // 最大连接数
        poolConfig.setMaxIdle(5);  // 最大空闲连接数
        poolConfig.setMinIdle(1);  // 最小空闲连接数
        poolConfig.setTestOnBorrow(true); // 获取连接时测试连接有效性

        // 根据是否有密码创建连接池
        if (password != null && !password.isEmpty()) {
            jedisPool = new JedisPool(poolConfig, host, port, 2000, password);
        } else {
            jedisPool = new JedisPool(poolConfig, host, port, 2000);
        }
    }

    /**
     * 向Redis写入数据，键格式为prefix+phoneNumber，值为Integer类型
     *
     * @param phoneNumber   键的代码部分
     * @param value  要存储的整数值
     * @return 是否写入成功
     */
    public static boolean setData(String phoneNumber, String  value) {
        if (jedisPool == null) {
            throw new IllegalStateException("Redis连接池未初始化，请先调用init方法");
        }

        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String key = "verifyCode" + phoneNumber;
            // 存储数据并设置过期时间
            String result = jedis.setex(key, EXPIRATION_SECONDS, value);
            return "OK".equals(result);
        } catch (Exception e) {
            System.err.println("Redis写入失败：" + e.getMessage());
            return false;
        } finally {
            if (jedis != null) {
                jedis.close(); // 归还连接到连接池
            }
        }
    }

    /**
     * 从Redis读取数据
     *
     * @param phoneNumber   键的代码部分
     * @return 存储的整数值，若不存在或出错则返回null
     */
    public static String  getData( String phoneNumber) {
        if (jedisPool == null) {
            throw new IllegalStateException("Redis连接池未初始化，请先调用init方法");
        }

        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String value = jedis.get("verifyCode" + phoneNumber);
            return value != null ? value : null;
        } catch (NumberFormatException e) {
            System.err.println("Redis数据格式错误：" + e.getMessage());
            return null;
        } catch (Exception e) {
            System.err.println("Redis读取失败：" + e.getMessage());
            return null;
        } finally {
            if (jedis != null) {
                jedis.close(); // 归还连接到连接池
            }
        }
    }

    /**
     * 关闭Redis连接池
     */
    public static void close() {
        if (jedisPool != null) {
            jedisPool.close();
            jedisPool = null;
        }
    }
    public static  String generateVerifyCode(){
        Random random = new Random();
        //random.nextInt(900000)=[0,899999]  random.nextInt(900000)+100000=[100000,999999]
        return  (random.nextInt(900000)+100000)+"";
    }



    public static void main(String[] args) {
        try {
            // 初始化Redis连接
            RedisUtil.init("172.16.8.8", 6379, "");

            // 写入数据
            boolean writeSuccess = RedisUtil.setData( "15238656699", RedisUtil.generateVerifyCode());
            System.out.println("写入结果：" + (writeSuccess ? "成功" : "失败"));

            // 读取数据
            String stock = RedisUtil.getData( "15238656699");
            System.out.println("当前库存：" + (stock != null ? stock : "未找到数据"));

        } catch (IllegalStateException e) {
            System.err.println("操作失败：" + e.getMessage());
        } finally {
            // 关闭连接池
            RedisUtil.close();
        }
    }
}
